package br.com.imob.dao;

import br.com.imob.modelo.Imovel;

import java.util.List;

/** @user Gilton Nascimento
 *  @since 12:30:23 02/02/2011 2011
 *  @version 
 */

public class ImovelDao extends GenericDao {

    public ImovelDao() { }

    public Integer adicionarImovel(Imovel imovel) {
        saveOrUpdatePojo(imovel);
        return imovel.getImovelId();
    }

    public void removerImovel(Imovel imovel) {
        removerPojo(imovel);
    }

    public void atualizarImovel(Imovel recupera) {
        saveOrUpdatePojo(recupera);
    }
    
    /**
	 * Editar um Imovel
	 * @param String oldImovel
	 * @param String newImovel
	 */
	public void atualizarImovel(int id, String tpStr, String oldImovel, String newImovel ) {
		
		if ( "dscInterna".equals(tpStr) 		|| "dscExterna".equals(tpStr) 
			|| "acabamentoInterna".equals(tpStr)|| "acabamentoExterna".equals(tpStr)
			|| "extra".equals(tpStr) 			|| "quarto".equals(tpStr) 
			|| "suite".equals(tpStr) 			|| "valor".equals(tpStr) 
			|| "iptu".equals(tpStr) 			|| "titulo".equals(tpStr) 
			|| "situacao".equals(tpStr) 		|| "frente".equals(tpStr) 
			|| "fundo".equals(tpStr) 			|| "ladoDireito".equals(tpStr) 
			|| "ladoEsquerdo".equals(tpStr) 	|| "areaLote".equals(tpStr) 
			|| "areaPrivativa".equals(tpStr) 	|| "areaTotal".equals(tpStr)
			|| "entrega".equals(tpStr) 			|| "condominio".equals(tpStr) 
			|| "emplacado".equals(tpStr) 		|| "exclusivo".equals(tpStr)
			) {
			
			if ( ( !"".equalsIgnoreCase(oldImovel) && oldImovel != null )
					&& ( !"".equalsIgnoreCase(newImovel) && newImovel != null ) ) 
				atualizarImovel( getImovelByQueryId_Arg(id, tpStr, oldImovel), new Imovel(tpStr, newImovel) );
		}

	}
	
	/**
     * @param id
     * @param tpStr
     * @param arg
     * @return Imovel
     */
	public Imovel getImovelByQueryId_Arg(int id, String tpStr, String arg) {
    	String query = "SELECT p FROM Imovel WHERE imovelId ="+id+" AND "+tpStr+" = "+arg;
    	return getPojoByQry(query);
    }
	
	
    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */
    public void atualizarImovel(Imovel recuperar, Imovel alterar) {
        recuperar = retriveImovel(recuperar);
//  DscInterna
        if ( alterar.getDscInterno() != null )
            recuperar.setDscInterno( alterar.getDscInterno() );
//  DscInterna
        if ( alterar.getDscExterno() != null )
            recuperar.setDscExterno( alterar.getDscExterno() );
//  AcabamentoInterno
        if ( alterar.getAcabamentoInterno() != null )
            recuperar.setAcabamentoInterno( alterar.getAcabamentoInterno() );
//  AcabamentoExterno
        if ( alterar.getAcabamentoExterno() != null )
            recuperar.setAcabamentoExterno( alterar.getAcabamentoExterno() );
//  Extra
        if ( alterar.getExtra() != null )
            recuperar.setExtra( alterar.getExtra() );
//  Quarto
        if ( alterar.getQuarto() != null )
            recuperar.setQuarto( alterar.getQuarto() );
//  Suite
        if ( alterar.getSuite() != null )
            recuperar.setSuite( alterar.getSuite() );
//  Valor
        if ( alterar.getValor() != 0 )
            recuperar.setValor( alterar.getValor() );
//  Iptu
        if ( alterar.getIptu() != null )
            recuperar.setIptu( alterar.getIptu() );
//  Data Cadastro
        if ( alterar.getDataCadastro() != null )
        	recuperar.setDataCadastro( alterar.getDataCadastro() );
//  Titulo
        if ( alterar.getTitulo() != null )
            recuperar.setTitulo( alterar.getTitulo() );
//  Frente
        if ( alterar.getFrente() != null )
            recuperar.setFrente( alterar.getFrente() );
//  Fundo
        if ( alterar.getFundo() != null )
            recuperar.setFundo( alterar.getFundo() );
//  LadoEsquerdo
        if ( alterar.getLadoEsquerdo() != null )
            recuperar.setLadoEsquerdo( alterar.getLadoEsquerdo() );
//  Lado Direito
        if ( alterar.getLadoDireito() != null )
            recuperar.setLadoDireito( alterar.getLadoDireito() );
//  Area Lote
        if ( alterar.getAreaLote() != null )
        	recuperar.setAreaLote( alterar.getAreaLote());
//  Area Privativa
        if ( alterar.getAreaPrivativa()!= null )
        	recuperar.setAreaPrivativa( alterar.getAreaPrivativa());
//  Area Total
        if ( alterar.getAreaTotal()!= null )
        	recuperar.setAreaTotal( alterar.getAreaTotal());
//  Entrega
        if ( alterar.getEntrega()!= null )
        	recuperar.setEntrega( alterar.getEntrega());
//  Condominio
        if ( alterar.getCondominio()!= null )
        	recuperar.setCondominio( alterar.getCondominio());
//  Emplacado
        if ( alterar.getEmplacado()!= null )
        	recuperar.setEmplacado( alterar.getEmplacado());
//  Exclusiva
        if ( alterar.getExclusiva()!= null )
        	recuperar.setExclusiva( alterar.getExclusiva());
//  Foto
        if ( alterar.getFoto()!= null )
        	recuperar.setFoto( alterar.getFoto());

        saveOrUpdatePojo(recuperar);
    }

    /*Artificio para Recuperar a Tupla de Imovel*/
    protected Imovel retriveImovel(Imovel recuperar) {
        if (recuperar.getImovelId() != null)
            return getImovel(recuperar.getImovelId());

        if (recuperar.getDscInterno() != null)
            return getImovelQNamedDscInterno(recuperar.getDscInterno());

        if (recuperar.getDscExterno() != null)
            return getImovelQNamedDscExterno(recuperar.getDscExterno());
        
        if ( recuperar.getAcabamentoInterno() != null )
            return getImovelQNamedAcabamentoInterno( recuperar.getAcabamentoInterno() );
        
        if ( recuperar.getAcabamentoExterno() != null )
            return getImovelQNamedAcabamentoExterno( recuperar.getAcabamentoExterno() );
        
        if ( recuperar.getExtra() != null )
            return getImovelQNamedExtra( recuperar.getExtra() );

        if ( recuperar.getIptu() != null )
            return getImovelQNamedIptu( recuperar.getIptu() );

        if ( recuperar.getTitulo() != null )
            return getImovelQNamedTitulo( recuperar.getTitulo() );

//  Area Lote
        if ( recuperar.getAreaLote() != null )
        	return getImovelQNamedAreaLote( recuperar.getAreaLote() );
//  Entrega
        if ( recuperar.getEntrega()!= null )
        	return getImovelQNamedEntrega( recuperar.getEntrega() );

        return recuperar;
    }

    
//  Consultas
    public Imovel getImovel(Integer key) {
        return getPojoByID(Imovel.class, key);
    }

    public Imovel getImovelByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }

/* Find By Attributs */
//  DscInterna
    public Imovel getImovelQNamedDscInterno(String fltrDscInterna) {
        return getPojoByQNamed("Imovel.findByDscInterna", fltrDscInterna);
    }
//  DscExterna
    public Imovel getImovelQNamedDscExterno(String fltrSbnome) {
        return getPojoByQNamed("Imovel.findByDscExterna", fltrSbnome);
    }    
//  AcabamentoInterno
    public Imovel getImovelQNamedAcabamentoInterno(String fltrAcabInterno) {
        return getPojoByQNamed("Imovel.findByAcabamentoInterno", fltrAcabInterno);
    }
//  AcabamentoExterno
    public Imovel getImovelQNamedAcabamentoExterno(String fltrAcabExterno) {
        return getPojoByQNamed("Imovel.findByAcabamentoExterno", fltrAcabExterno);
    }
//  Extra
    public Imovel getImovelQNamedExtra(String fltrAcabExterno) {
    	return getPojoByQNamed("Imovel.findByExtra", fltrAcabExterno);
    }
//  IPTU
    public Imovel getImovelQNamedIptu(String fltrIptu) {
    	return getPojoByQNamed("Imovel.findByIptu", fltrIptu);
    }
//  Titulo
    public Imovel getImovelQNamedTitulo(String fltrTitulo) {
    	return getPojoByQNamed("Imovel.findByTitulo", fltrTitulo);
    }
//  Situacao
    public Imovel getImovelQNamedSituacao(String fltrSituacao) {
    	return getPojoByQNamed("Imovel.findBySituacao", fltrSituacao);
    }
//  AreaLote
    public Imovel getImovelQNamedAreaLote(String fltrAreaLote) {
    	return getPojoByQNamed("Imovel.findByAreaLote", fltrAreaLote);
    }
//  Entrega
    public Imovel getImovelQNamedEntrega(String fltrEntrega) {
    	return getPojoByQNamed("Imovel.findByEntrega", fltrEntrega);
    }

/*  LIKES */
    
//  DscInterna
    public List<Imovel> getImoveisQNamedDscInternaPRX(String fltrDscInterna) {
        return getListByQNamedPRX("Imovel.findLikeByDscInterna", fltrDscInterna);
    }
//  DscExterna
    public List<Imovel> getImoveisQNamedSbDscInternaPRX(String fltrSbnome) {
        return getListByQNamedPRX("Imovel.findLikeByDscExterna", fltrSbnome);
    }
//  AcabamentoInterno
    public List<Imovel> getImoveisQNamedAcabamentoInternoPRX(String fltrAcabamentoInterno) {
        return getListByQNamedPRX("Imovel.findLikeByAcabamentoInterno", fltrAcabamentoInterno);
    }
//  AcabamentoExterno
    public List<Imovel> getImoveisQNamedAcabamentoExternoPRX(String fltrAcabExterno) {
        return getListByQNamedPRX("Imovel.findLikeByAcabamentoExterno", fltrAcabExterno);
    }
//  Extra
    public List<Imovel> getImoveisQNamedExtraPRX(String fltrAcabExterno) {
    	return getListByQNamedPRX("Imovel.findLikeByExtra", fltrAcabExterno);
    }
//  IPTU
    public List<Imovel> getImoveisQNamedIptuPRX(String fltrIptu) {
    	return getListByQNamedPRX("Imovel.findLikeByIptu", fltrIptu);
    }
//  Titulo
    public List<Imovel> getImoveisQNamedTituloPRX(String fltrTitulo) {
    	return getListByQNamedPRX("Imovel.findLikeByTitulo", fltrTitulo);
    }
//  Situacao
    public List<Imovel> getImoveisQNamedSituacaoPRX(String fltrSituacao) {
    	return getListByQNamedPRX("Imovel.findLikeBySituacao", fltrSituacao);
    }
//  AreaLote
    public List<Imovel> getImoveisQNamedAreaLotePRX(String fltrAreaLote) {
    	return getListByQNamedPRX("Imovel.findLikeByAreaLote", fltrAreaLote);
    }
//  Entrega
    public List<Imovel> getImoveisQNamedEntregaPRX(String fltrEntrega) {
    	return getListByQNamedPRX("Imovel.findLikeByEntrega", fltrEntrega);
    }
    
    
/* Fim dos Likes */


//LISTAS
    public List<Imovel> getImoveis() {
        return (List<Imovel>) getALL(Imovel.class);
    }

//  Quarto
    public List<Imovel> getImoveisQNamedQuarto(String fltrQuarto) {
        return getListByQNamed("Imovel.findByQuarto", fltrQuarto);
    }
//  Extra
    public List<Imovel> getImoveisQNamedExtra(String fltrExtra) {
        return getListByQNamed("Imovel.findByExtra", fltrExtra);
    }
//  Suite
    public List<Imovel> getImoveisQNamedSuite(Integer fltrSuite) {
        return getListByQNamed("Imovel.findBySuite", fltrSuite);
    }
//  Valor
    public List<Imovel> getImoveisQNamedValor(Double fltrValor) {
        return getListByQNamed("Imovel.findByValor", fltrValor);
    }
//  Data Cadastro
    public List<Imovel> getImoveisQNamedDataCadastro(String fltrDataCadastro) {
        return getListByQNamed("Imovel.findByDataCadastro", fltrDataCadastro);
    }
//  Frente
    public List<Imovel> getImoveisQNamedFrente(String fltrFrente) {
        return getListByQNamed("Imovel.findByFrente", fltrFrente);
    }
//  Fundo
    public List<Imovel> getImoveisQNamedFundo(String fltrFundo) {
    	return getListByQNamed("Imovel.findByFundo", fltrFundo);
    }
//  LadoEsquerdo
    public List<Imovel> getImoveisByLadoEsquerdo( Integer ldEsquerdo ) {
        return getListByQNamed("Imovel.findByLadoEsquerdo", ldEsquerdo);
    }
//  LadoDireito
    public List<Imovel> getImoveisByLadoDireito( Integer ldDireito ) {
    	return getListByQNamed("Imovel.findByLadoDireito", ldDireito);
    }
//  AreaPrivativa
    public List<Imovel> getImoveisByAreaPrivativa( Integer aPrivativa ) {
    	return getListByQNamed("Imovel.findByAreaPrivativa", aPrivativa);
    }
//  AreaTotal
    public List<Imovel> getImoveisByAreaTotal( Integer aTotal ) {
    	return getListByQNamed("Imovel.findByAreaTotal", aTotal);
    }
//  Condominio
    public List<Imovel> getImoveisByCondominio( Integer condominio ) {
    	return getListByQNamed("Imovel.findByCondominio", condominio);
    }
//  Emplacado
    public List<Imovel> getImoveisByEmplacado( boolean isEmplacado ) {
    	if ( isEmplacado )
    		return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE emplacado is " + true );
    	else
    		return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE emplacado is " + false );
    }
//  Exclusiva
    public List<Imovel> getImoveisByExclusiva( boolean isExclusiva ) {
        if ( isExclusiva )
            return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE exclusiva is " + true );
        else
            return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE exclusiva is " + false );
    }
//  FOTO
    public List<Imovel> getImoveisByFoto( boolean temFoto ) {
        if ( temFoto )
            return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE foto is not null" );
        else
            return getListByQry( "SELECT * FROM \"IMOVEL\" WHERE foto is null" );
    }
    
    public List<Imovel> getImoveisByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }

}